package part04_观察者模式.p02_观察者模式解决;

import java.util.ArrayList;

/**被观察的天气类（核心类）
 * @ClassName: WeatherData
 * @Author: AllenSun
 * @Date: 2019/12/6 19:55
 */
public class WeatherData implements Subject {

    private float temperature;
    private float pressure;
    private float humidity;
    //Observe接口下面的实现类不管，直接
    private ArrayList<Observer> observers;

    public WeatherData(){
        observers=new ArrayList<Observer>();
    }

    public float getTemperature() {
        return temperature;
    }

    public float getPressure() {
        return pressure;
    }

    public float getHumidity() {
        return humidity;
    }

    /**给天气类的数据赋值（天气类会自动通知给它的观察者们）
     * @MethodName: setData
     * @Author: AllenSun
     * @Date: 2019/12/6 20:08
     */
    public void setData(float temperature, float pressure, float humidity){
        this.temperature=temperature;
        this.pressure=pressure;
        this.humidity=humidity;
        dataChange();
    }

    /**当新数据被设置后，会通知观察者们
     * @MethodName: dataChange
     * @Author: AllenSun
     * @Date: 2019/12/6 20:09
     */
    public void dataChange(){
        notifyObserver();
    }

    /**注册观察者
     * @MethodName: registerObserver
     * @Author: AllenSun
     * @Date: 2019/12/6 20:06
     */
    @Override
    public void registerObserver(Observer observer) {
        observers.add(observer);
    }

    /**移除观察者
     * @MethodName: removeObserver
     * @Author: AllenSun
     * @Date: 2019/12/6 20:07
     */
    @Override
    public void removeObserver(Observer observer) {
        if(observers.contains(observer)){
            observers.remove(observer);
        }
    }

    /**通知观察者（观察者收到通知后会调用update方法，它们的实现类也就完成了更新）
     * @MethodName: notifyObserver
     * @Author: AllenSun
     * @Date: 2019/12/6 20:07
     */
    @Override
    public void notifyObserver() {
        for (int i = 0; i < observers.size(); i++) {
            observers.get(i).update(this.temperature,this.pressure,this.humidity);
        }
    }
}
